Classes


    Em POO uma classe é um constructo capaz de descrever computacionalmente uma entidade do mundo real. Classes são tipos, ou seja, descrevem um tipo específico de entidade de forma genérica. Por exemplo, uma classe Carro não descreve um carro específico, mas sim qualquer carro.


    Portanto, ao criar uma classe lembre-se de procurar quais são as características e comportamentos comuns a todos os objetos daquele tipo. No caso do Carro a linha de raciocínio será: O que todos os carros têm em comum e o que é específico de cada carro?


    Dessa forma, uma carcterística "partida elétrica", por exemplo, fará menos sentido do que uma característica "tipo de partida", afinal uma só se aplica aos carros com partida elétrica e a outra se aplica a qualquer carro.


    No JAVA cada classe precisa ser criada em seu próprio arquivo e é obrigatório que o nome do arquivo seja o mesmo nome da classe.


    Para criar uma classe em JAVA basta utilizar a palavra class seguida do nome da classe (com primeira letra maiúscula) e chaves:


        class Carro{


        }


    Tudo que pertencer à classe Carro deverá estar entre as chaves. Na grande maioria das vezes, queremos que nossas classes possam ser vistas e utilizadas pelo restante do programa. Para isso convencionamos utilizar a palavra public, que veremos o que é mais adiante, na frente da declaração de uma classe.


        public class Carro{


        }


    Também podemos expressar uma classe usando a "Unified Modeling Language" ou UML, que contém um diagrama intuitivamente chamado Diagrama de classe para representar classes em uma forma visual.


Atributos


    Quando modelamos um cenário do mundo real para uma linguagem computacional fazemos um exercício de abstração:


    Primeiro definimos quais das entidades que observamos são parte essencial do nosso problema. Isso definirá quais classes teremos no programa.


    A seguir, definiremos quais são as características dessa entidade que precisam ser incluídas em nosso modelo. Para isso, precisamos nos referir a um domínio. A palavra domínio nesse contexto será o problema a ser resolvido. Então, usamos a abstração para elencar quais características são essenciais para o problema e quais podem ser ignoradas.


    O domínio é essencial porque a mesma entidade terá características importantes diferentes em cada domínio.


    Por exemplo, uma entidade Pessoa pode aparecer em diversos domínios, quase todo sistema tem alguma entidade representando seres humanos. No entanto, a Pessoa muda de domínio para domínio. Em uma escola, podemos descrever uma pessoa pelo seu nome, idade e matrícula por exemplo. Já em uma academia precisamos de peso e altura. Em uma agência de modelos talvez a cor dos olhos, a cor do cabelo e a cor da pele da pessoa seja importante.


    Seria muito estranho uma escola querer registrar a cor de pele dos alunos, assim como seria estranho uma academia querer saber a cor dos olhos. O importante é perceber que domínios diferentes representam sua entidades com características diferentes. Quais características colocar? Apenas as relevantes ao problema!


    Assim como chamamos as Entidades de Classes, na POO, também temos uma palavra especial para Características: Atributos.


    Formalmente um atributo é composto por 3 coisas: Nome, Tipo e Encapsulamento.


    Nome: Deve descrever com precisão que característica ele representa, mas deve obedecer as convenções de cada linguagem. Tipo: Deve ser um tipo primitivo, uma classe ou uma interface. Encapsulamento: Define a visibilidade do atributo para fora da classe. Veremos mais a frente como usar.


    Definir o nome de um atributo é o mais fácil, obedeça às regras de nomes de variáveis da liguagem de programação que você vai utilizar, no geral não coloque acentos, espaços, caracteres especiais ou inicie com números (varia de linguagem para linguagem). No JAVA, temos a convenção de usar letras minúsculas, execeto ao juntar palavras quando a letra inicial de cada palavra (a partir da segunda) deverá ser maiúscula, por exemplo, nomeCompleto. Lembre-se de usar nomes bons para descrever as características!


    Quanto ao tipo: Você pode escolher qualquer um dos tipos primitivos do JAVA.


    Você pode escolher qualquer classe: Usamos a classe String para representar textos de múltiplos caracteres. O tipo de um atributo pode ser uma classe que você mesmo criou.


    Para escrever um atributo em JAVA basta seguir a sintaxe " ;".


        public class Carro{

                public String marca;

                public String modelo;

                public int ano;

                public float preco;

        }


    Veja que não colocamos valores nos atributos, isso se dá porque a classe é uma estrutura genérica para representar qualquer objeto de seu tipo. Não faz sentido dizer que todo carro é Fiat ou do ano 2018!


Objetos


    É nos objetos que armazenamos os valores para os atributos que fizemos nas classes. Por enquanto, podemos pensar nas classes como a declaração de uma estrutura de dados e nos objetos como as estruturas de dados preenchidas com os valores. Também podemos fazer a analogia da classe como um formulário em branco contendo os campos e o objeto como as respostas preenchidas nesses campos de um formulário.


    Linguagens orientadas a objetos só rodam aqueles códigos que aprendemos em lógica de programação ou algoritmos dentro de métodos. Seu programa roda a partir de um método especial chamado main. Ele marca onde seu programa começa a executar. Quando fazemos classes elas ficam em arquivos diferentes e apenas uma deve ter o método main. Abaixo mostramos como criar objetos, mas só podemos criá-los dentro de métodos, portanto precisamos de uma classe com o método main.


    Para criar um objeto precisamos fazer duas coisas:


    1.        Declarar uma variável do mesmo tipo do objeto. Isso é fácil, lembre-se que o tipo do objeto é o mesmo tipo da classe e que o tipo da classe é seu nome.


    2.        Atribuir à variável (=) o comando new seguido do nome da classe + ( );


    Portanto, para construir um obejto da classe Carro:


        public class Programa{

                public static void main(String[] args){


                        Carro c = new Carro();


                }

        }


    Nosso objeto foi criado pelo comando new seguido de um método especial chamado construtor (falaremos dele em breve).


    O objeto está guardado na variável de tipo Carro e nome c.


    Assim, podemos acessar nosso objeto usando c e usando o "." acessamos os atributos.


    Observe que todos os atributos públicos que criamos podem ser acessados por "c.(nome_do_atributo)".


    O código abaixo mostra como ler e atribuir valores em atributos:


        System.out.println(c.marca); //imprime o valor de marca na tela

        c.marca = "Fiat"; // altera o valor de marca

        System.out.println(c.marca); //agora imprime o valor Fiat na tela


    Observe que você pode criar quantos carros quiser usando a classe Carro:


        public class Programa{

                public static void main(String[] args){


                        Carro c = new Carro();

                        Carro c1 = new Carro();

                        Carro c2 = new Carro();

                        Carro c3 = new Carro();

                        Carro c4 = new Carro();

                        Carro c5 = new Carro();


                }

        }